/**
 * 00004 - Easy Pick 解决方案
 */

import type { Equal, Expect } from '@type-challenges/utils'

// 解决方案：实现 Pick 工具类型
type MyPick<T, K extends keyof T> = {
  [P in K]: T[P]
}

// ========== 测试用例 ==========

interface Todo {
  title: string
  description: string
  completed: boolean
}

interface Expected1 {
  title: string
}

interface Expected2 {
  title: string
  completed: boolean
}

type cases = [
  // 基本测试
  Expect<Equal<Expected1, MyPick<Todo, 'title'>>>,
  Expect<Equal<Expected2, MyPick<Todo, 'title' | 'completed'>>>,
  
  // 边界情况测试
  Expect<Equal<{}, MyPick<Todo, never>>>,
  Expect<Equal<Todo, MyPick<Todo, 'title' | 'description' | 'completed'>>>,
]

// 运行测试（现在应该没有类型错误）
type test1 = Expect<Equal<Expected1, MyPick<Todo, 'title'>>>
type test2 = Expect<Equal<Expected2, MyPick<Todo, 'title' | 'completed'>>>

/**
 * 解答说明：
 * 
 * 1. `K extends keyof T` - 约束 K 必须是 T 的键的子集
 * 2. `[P in K]` - 使用映射类型遍历 K 中的每个键
 * 3. `T[P]` - 获取 T 中对应键的类型
 * 
 * 这样就实现了从类型 T 中选择属性 K 来构造新类型的功能。
 */ 